package com.shp.utils;

import org.apache.logging.log4j.util.PropertiesUtil;

import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Properties;

/**
 * Description:
 * File删除文件和文件夹方法：<br/>
 *  1.删除文件：存在文件则直接删除返回true,如果不存在返回false<br/>
 *  2.删除目录：<br/>
 *    1)：为空：直接删除<br/>
 *    2)：不为空：删不掉 (需要先删除文件夹里面所有文件，再删除文件夹)<br/>
 *    3)：不存在直接返回false<br/>
 *<br/>
 * 注意：delete方法 ==》直接从磁盘中删除，不能像回收站一样可以恢复<br/>
 * @author zwl
 * @version 1.0
 * @date 2020/3/21 19:45
 */
public class DeleteFileUtil {

    /**
     * 图片路径
     */
    private static StringBuilder imageAddress = null;

    static{
        // 创建属性集合
        Properties properties = new Properties();
        try {
            // 将配置文件properties中的键值对，保存到Properties集合
            properties.load(PropertiesUtil.class.getResourceAsStream("/upload.properties"));
            imageAddress = new StringBuilder(properties.getProperty("imagesAddress"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // public static void main(String[] args) {
    //     deleteFile(new File("C:\\Users\\ZWL\\Desktop\\45"));
    // }


    /**
     * 删除项目的某个商品图片
     * @param fileName 商品图片名
     * @return true代表删除成功；否则删除失败
     */
    public static boolean deleteImage(String fileName){
        if(fileName != null && fileName != ""){
            imageAddress.append(File.separator).append(fileName);
            System.out.println(imageAddress);
            return  deleteFile(new File(imageAddress.toString()));
        }
        return false;
    }

    /**
     * 删除项目的商品图片
     * @param fileNames 商品图片名
     */
    public static void deleteImages(List<String> fileNames){
        if(fileNames != null && !fileNames.isEmpty()){
            for(String str : fileNames){
                if(deleteFile(new File(str))){
                    break;
                }
            }
        }
    }

    /**
     * 删除目录以及目录下的所有标准文件，或者删除文件
     * @param file java.io.File
     * @return true代表删除成功；否则删除失败
     */
    public static boolean deleteFile(File file){
        // 判断文件是否存在
        if(file.exists()){
            boolean flag;
            String absolutePath = file.getAbsolutePath();
            // 判断是否是一个标准文件
            if(file.isFile()){
                System.out.println("【delete file Start...】=>" + absolutePath);
                flag = file.delete();
                if(flag){
                    System.out.println("【delete file Success...】=>" + absolutePath);
                }else{
                    System.out.println("【delete file Failed...】=>" + absolutePath);
                }
                return flag;
            }
            // 判断是否是一个目录
            if(file.isDirectory()){
                // 获取该目录下的所有文件和目录
                File[] files = file.listFiles();
                // 遍历
                if (files != null) {
                    for(File f : files){
                        /*
                         * 递归作用：由外到内先一层一层删除里面的文件 再从最内层 反过来删除文件夹
                         *    注意：此时的文件夹在上一步的操作之后，里面的文件内容已全部删除
                         *         所以每一层的文件夹都是空的  ==》最后就可以直接删除了
                         */
                        if(!deleteFile(f)){
                            break;
                        }
                    }
                }
                // 删除剩余的空目录
                System.out.println("【delete file Start...】=>" + absolutePath);
                flag = file.delete();
                if(flag){
                    System.out.println("【delete file Success...】=>" + absolutePath);
                }else{
                    System.out.println("【delete file Failed...】=>" + absolutePath);
                }
                return flag;
            }
            System.out.println(absolutePath + "：This file is not a standard file or directory");
            return false;
        }
        System.out.println( "File does not exist");
        return false;
    }
}
